#!/usr/bin/perl
# file: whos_there.pl

use strict;
my %who;
open (WHOFH, "who |") or die "Cannot open who: $!";     # 用who命令打开一个管道
while(<WHOFH>){                                         # 读取who命令的输出
    next unless /^(\S+)/;
    $who{$1}++;
}
foreach(sort{$who{$b}<=>$who{$a}}keys %who){
    printf "%10s %d\n", $_, $who{$_};
}
close WHOFH or die "Close error: $!";

# 生成一个报告，分别指出哪些用户登录系统多少次，并且按照次数递减顺序排列。


# 管道稍微增强了 open 函数和 close 函数提供关于子进程的额外信息的功能。
# 当打开一个管道时， open 返回管道另一端的命令的PID。
# 这是一个唯一的非零整数，可以用于通过信号监控子进程。

# 当管道关闭时，close 的功能也被增强了，将子进程的终止代码放置在特定全局变量 $? 中。
# 和多数 Perl 惯例相反， $? 为0表示成功，错误时为非0值。

# close 另一个方面，当关闭一个写通道时，close 调用将进入阻塞状态直到另一端的进程完成它的全部工作并终止。
# 如果你读到EOF之前关闭一个读通道，另一端的程序下一次尝试向标准输出写时会得到一个PIPE信号。